<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 函数柯里化
      // 作用一： 参数的复用--1.正则
      // checkByRegExp(/^1\d{10}$/, '1234444422')
      // checkByRegExp(/^1\d{10}$/, '12323423422')
      // checkByRegExp(/^1\d{10}$/, '1234233224422')

      // function checkByRegExp(reg, str) {
      //   console.log(reg.test(str))
      // }

      // 使用函数柯里化==》
      function checkByRegExp(reg) {
        return function str(str) {
          return reg.test(str)
        }
      }

      checkPhone = checkByRegExp(/^1\d{10}$/)
      console.log(checkPhone('1234444422'))
      console.log(checkPhone('12323423422'))
      console.log(checkPhone('1234233224422'))

      // 作用二 --提前返回
      function addEvent(ele, type, fn) {
        if (window.addEventListener) {
          ele.addEventListener(type, fn)
        } else if (window.attachEvent) {
          ele.attachEvent('on' + type, fn)
        }
      } // ===>函数柯里化

      function curryingAddEvent() {
        if (window.addEventListener) {
          return function addEvent(ele, type, fn) {
            ele.addEventListener(type, fn)
          }
        } else if (window.attachEvent) {
          return function addEvent(ele, type, fn) {
            ele.attachEvent('on' + type, fn)
          }
        }
      }

      //后续调用使用 curryingAddEvent()() 不用重复判断是否有监听事件

      // 作用三---延迟调用
      //柯里化突出一种重要思想：降低适用范围，提高适用性
      // 柯里化的三个作用和特点：参数复用、提前返回、延迟执行
      // 柯里化是闭包的一个典型应用，利用闭包形成了一个保存在内存中的作用域，把接收到的部分参数保存在这个作用域中，等待后续使用。并且返回一个新函数接收剩余参数


    </script>
  </body>
</html>
